package my_file

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"os"
	"path"
	"strings"
	"study/server/global"
	"study/server/middleware"
	resp "study/server/model/response"
	"study/server/utils/md5"
	"time"
)

type FileApi struct {
}

func (f *FileApi) UploadFile(c *gin.Context) {
	flagTag := false
	file, err := c.FormFile("file")
	if err != nil {
		resp.FailWithMsg("请上传文件", c)
		return
	}

	// 文件大小判断
	if file.Size > global.Config.UploadFile.MaxSize*1024*1024 {
		msg := fmt.Sprintf("文件大小不能超过%dMB", global.Config.UploadFile.MaxSize*1024*1024)
		resp.FailWithMsg(msg, c)
		return
	}
	// 文件类型判断
	allowTypes := global.Config.UploadFile.AllowTypes
	var fileExt = map[string]bool{}
	for _, v := range allowTypes {
		fileExt[v] = true
	}

	ext := path.Ext(file.Filename) // 该方法返回文件名的扩展名
	if _, ok := fileExt[strings.ToLower(ext)]; !ok {
		resp.FailWithMsg("文件类型错误,只支持"+strings.Join(allowTypes, " ")+"等类型", c)
		return
	}

	authUser := middleware.GetTokenFromContext(c)
	dst := fmt.Sprintf("%s/%s/%s", global.Config.UploadFile.Path, authUser.Username, file.Filename)

	// 检查文件是否存在
	if _, err := os.Stat(dst); err == nil {
		// 文件存在则进行检查内容是否相同，内容相同则不进行存储，否则随机重命名新文件进行存储
		newFile, _ := file.Open()
		oldFile, _ := os.Open(dst)
		newFileMd5 := md5.FileToMd5(newFile)
		oldFileMd5 := md5.FileToMd5(oldFile)
		if newFileMd5 == oldFileMd5 {
			resp.FailWithMsg("文件已存在,不可重复上传", c)
			return
		} else {
			// 随机重命名新文件
			fileName := fmt.Sprintf("%s_%d%s", strings.TrimSuffix(file.Filename, ext), time.Now().Unix(), ext)
			dst = fmt.Sprintf("%s/%s/%s", global.Config.UploadFile.Path, authUser.Username, fileName)
			flagTag = true
		}
	}

	err = c.SaveUploadedFile(file, dst)
	if err != nil {
		logrus.Error("上传文件失败", err)
		//fmt.Println(err)
		resp.FailWithMsg("文件上传失败", c)
		return
	}
	if flagTag {
		resp.Ok("http://localhost:38888"+"/"+dst, "文件上传成功，由于文件命名重复，已随机重命名", c)
	} else {
		resp.Ok("http://localhost:38888"+"/"+dst, "文件上传成功", c)
	}
}
